import pygame
import sys
import random
from player import Player
from balas import Balas


class Juego(object):

    def __init__(self, difficulty, pantalla):
        self.balas = Balas()
        self.balasEnemigas = Balas()
        self.dificultad = difficulty
        self.scorePlayer = 0
        self.termino = False
        self.pantalla = pantalla

    def colision(self, nave, balas):
        retornable = False
        for bala in balas[:]:
            if bala.colisiona(nave):
                balas.remove(bala)
                retornable = True
        return retornable

    def calcularScore(self):
        if not self.termino:
            balasGastadas = len(self.balas.lista)
            balasEsquivadas = len(self.balasEnemigas.lista)
            self.scorePlayer -= balasGastadas * 2 + balasEsquivadas
            self.termino = True
            if self.scorePlayer < 0:
                self.scorePlayer = 0

    def main(self):
        #Creo un reloj
        reloj = pygame.time.Clock()
        disparoNave1 = pygame.mixer.Sound("smallShot.wav")
        #Cargo un sonido de disparo
        disparoNave2 = pygame.mixer.Sound("shot.wav")
        balaNave1 = pygame.image.load("bullet.png")
        #Cargo la imagen del laser
        balaNave2 = pygame.image.load("laser.png")
        imagen_fondo = pygame.image.load("space.png")
        #Cargo la imagen de la nave principal
        nave1Imagen = pygame.image.load("nave.png")
                        #Imagen    Sonido disparo imagen bala, left, top
        nave1 = Player(nave1Imagen, disparoNave1, balaNave1, self.pantalla.get_width() / 2, self.pantalla.get_height() - 100)
        #Cargo la imagen de la navie alienigena
        nave2Imagen = pygame.image.load("naveAlien.png")
        nave2Y = 50
        #Posicion aleatoria de la nave
        nave2X = random.Random().randint(0, self.pantalla.get_width())
                        #Imagen    sonido_bala  image_bala, left, top, vida, tiempo entre disparos
        nave2 = Player(nave2Imagen, disparoNave2, balaNave2, nave2X, nave2Y, 100, 20/self.dificultad)
        #Direccion de la nave alieniegna, arranca yendo a la derecha
        nave2VaAIzquierda = False
        movimientoNave2 = self.dificultad * 8
        movimientoNave1 = self.dificultad * 5
        x = 0
        y = 0
        gameOver = False
        col_fuente = (255, 255, 255)
        fuente_texto = pygame.font.Font(None, 100)
        game_over_texto = fuente_texto.render("Game Over", 0, col_fuente)
        win = False
        win_texto = fuente_texto.render("Winner!", 0, col_fuente)
        scorePlayer = 0
        score = fuente_texto.render(str(scorePlayer), 0, col_fuente)
        nave2Vidas = fuente_texto.render(str(nave2.vida), 0, col_fuente)

        #Loop principal
        while True:
            for event in pygame.event.get():
                    if (event.type == pygame.KEYUP) or (event.type == pygame.KEYDOWN):
                        if (event.key == pygame.K_ESCAPE):
                            sys.exit()
                        elif (event.key == pygame.K_LEFT):
                            #Muevo la nave hacia la izquierda
                            x = -movimientoNave1
                            y = 0
                        elif (event.key == pygame.K_DOWN):
                            x = 0
                            #Abajo
                            y = movimientoNave1
                        elif (event.key == pygame.K_UP):
                            x = 0
                            #Arriba
                            y = -movimientoNave1
                        elif (event.key == pygame.K_RIGHT):
                            #Derecha
                            x = movimientoNave1
                            y = 0
                        elif (event.key == pygame.K_SPACE):
                            #Disparo
                            nave1.disparar(self.balas)
            if not gameOver:
                nave1.mover(x, y)
                if not win:
                    if self.colision(nave2, self.balas.lista):
                        #Retorna true si fue destruida
                        win = nave2.disparado()
                        if win:
                            self.scorePlayer += 10000
                        else:
                            self.scorePlayer += 66
                    if self.colision(nave1, self.balasEnemigas.lista):
                        #Retorna true si fue destruida
                        gameOver = nave1.disparado()
                    #Genero la direccion de la nave alienigena
                    if nave2.rect.left > self.pantalla.get_width() - 50:
                        nave2VaAIzquierda = True
                    elif nave2.rect.left < 50:
                        nave2VaAIzquierda = False

                    #Muevo la nave alienigena dependiendo de la direccion
                    if nave2VaAIzquierda:
                        nave2.mover(-movimientoNave2, 0)
                    else:
                        nave2.mover(movimientoNave2, 0)

                    #Hago update de la nave 1
                    nave1.update(self.pantalla)
                    #Hago update de la nave 2
                    nave2.update(self.pantalla)
                    #Muestro las balas
                    self.balas.update(self.pantalla)
                    #Actualizo la posicion de las balas
                    self.balas.mover(-movimientoNave1)
                    #La nave alienigena se fija si es momento de disparar
                    nave2.disparar_si_es_necesario(self.balasEnemigas)
                    self.balasEnemigas.update(self.pantalla)
                    self.balasEnemigas.mover(movimientoNave2)

                #WIN
                else:
                    self.calcularScore()
                    #Render Win
                    score = fuente_texto.render(str(self.scorePlayer), 0, col_fuente)
                    self.pantalla.blit(score, (self.pantalla.get_width() / 2 - 200, self.pantalla.get_height() / 2 + 50))
                    self.pantalla.blit(win_texto, (self.pantalla.get_width() / 2 - 200, self.pantalla.get_height() / 2 - 50))

            else: #Game Over
                self.calcularScore()
                #Render Game Over
                score = fuente_texto.render(str(self.scorePlayer), 0, col_fuente)
                self.pantalla.blit(score, (600, 400))
                self.pantalla.blit(game_over_texto, (450, 300))
            #Render Scores
            nave2Vidas = fuente_texto.render(str(nave2.vida), 0, col_fuente)
            score = fuente_texto.render(str(self.scorePlayer), 0, col_fuente)
            self.pantalla.blit(score, (1100, 700))
            self.pantalla.blit(nave2Vidas, (0, 0))
            reloj.tick(24)
            pygame.display.update()
            self.pantalla.blit(imagen_fondo, (0, 0))






